package com.google.code.jtasks.client.ui.commands;

import com.google.code.jtasks.client.exceptions.TerminateException;
import com.google.code.jtasks.client.state.ClientState;
import com.google.code.jtasks.client.ui.Command;
import com.google.code.jtasks.client.ui.ScreenHelper;
import com.google.common.base.Optional;
import com.google.inject.Inject;

import java.net.URI;
import java.net.URISyntaxException;

/**
 * Команда смены адреса сервиса. Изменяет адрес серверной части для всех последующих запросов на сервер.
 */
public class ChangeServiceUriCommand implements Command {
    private final ScreenHelper helper;
    private final ClientState state;

    @Inject
    ChangeServiceUriCommand(ScreenHelper helper, ClientState state) {
        this.helper = helper;
        this.state = state;
    }

    @Override
    public String name() {
        return "Change service URI";
    }

    @Override
    public String description() {
        return "Changes service URI for all future actions";
    }

    /**
     * Запрашивает у пользователя URI сервера. Если URI невалидный, то даётся возможность повторного ввода.
     */
    @Override
    public void execute() throws TerminateException {
        URI uri = null;
        while (uri == null) {
            helper.drawString(5, 2, "Please enter new URI:");
            helper.refresh();

            Optional<String> uriString = helper.readStringWithOutputAt(5, 3);
            if (uriString.isPresent()) {
                return;
            }

            try {
                uri = new URI(uriString.get());
            } catch (URISyntaxException e) {
                helper.clear();
                helper.drawString(5, 2, "URI is not valid:");
                helper.drawString(5, 3, e.getMessage());
                helper.refresh();
                if (!helper.ask(5, 5, "Try again?")) {
                    return;
                }
            }
        }
        state.setServiceUri(uri);
    }
}
